/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package look;

import CommonTools.Actions;
import CommonTools.Admin;
import CommonTools.CheckerDemands;
import CommonTools.Demand;
import CommonTools.DemandsTModel;
import CommonTools.DesignTools;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import look.elements.AutoDeleteSettings;
import look.elements.DemandPanel;
import look.elements.DemandTablePanel;
import look.elements.LeftDemandPanel;

/**
 * Класс окна просмотра заявок
 *
 * @author Salnikov Aleksey
 */
public class DemandsWindow extends AdminWindow{

    JToolBar toolBar;
    JButton refreshB, deleteB, previousB, nextB, helpB, preferencesB, deleteAllB;
    protected boolean isRoot;
    protected DemandPanel demandPanel;
    protected DemandTablePanel demandTable;
    protected LeftDemandPanel leftPanel;
    protected CheckerDemands checker;

    public DemandsWindow(Admin admin) throws RemoteException
    {
        super("Заявки | Admin Ordo", admin);
        //isRoot = this.admin.getLogin().equals("root");
        isRoot = this.admin.isRoot();

        /*******************************************************
         * Иконка для окна
         ******************************************************/
        ImageIcon iconWindow = new ImageIcon("images/icon.png");
        this.setIconImage(iconWindow.getImage());

        /********************************************************
         * Настройка менеджера компоновки и создание компонентов
         * для его использования
         *******************************************************/
        Container c = this.getContentPane();
        c.setLayout(new BorderLayout());
        JPanel mainPanel = new JPanel(new GridBagLayout());
        c.add(mainPanel, BorderLayout.CENTER);
        GridBagConstraints gbc = new GridBagConstraints();
        GridBagConstraints rightTopGbc = new GridBagConstraints();
        GridBagConstraints rightButtonGbc = new GridBagConstraints();

        JSplitPane horSplit = new JSplitPane();
        horSplit.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
        c.add(horSplit);

        JSplitPane verSplit = new JSplitPane();
        verSplit.setOrientation(JSplitPane.VERTICAL_SPLIT);
        horSplit.setRightComponent(verSplit);

        /*******************************************************
         * Создаем визуальные компоненты и размещаем их
         * Тулбар
         ******************************************************/
        toolBar = new JToolBar();
        toolBar.setFloatable(false);
        c.add(toolBar, BorderLayout.NORTH);

        ImageIcon iconPrevious = new ImageIcon("images/previous.png");
        previousB = new JButton();
        previousB.setIcon(iconPrevious);
        previousB.setToolTipText("Предыдущая заявка");
        previousB.setFocusable(false);
        toolBar.add(previousB);

        ImageIcon iconNext = new ImageIcon("images/next.png");
        nextB = new JButton();
        nextB.setIcon(iconNext);
        nextB.setToolTipText("Следующая заявка");
        nextB.setFocusable(false);
        toolBar.add(nextB);

        JSeparator sep = new JSeparator();
        sep.setOrientation(sep.VERTICAL);
        toolBar.add(sep);

        ImageIcon iconRefresh = new ImageIcon("images/refresh.png");
        refreshB = new JButton();
        refreshB.setIcon(iconRefresh);
        refreshB.setToolTipText("Обновить заявки");
        refreshB.setFocusable(false);
        toolBar.add(refreshB);

        //Создание кнопок суперадмина
        if (isRoot)
        {
            JSeparator sep1 = new JSeparator();
            sep1.setOrientation(JSeparator.VERTICAL);
            ImageIcon iconDelete = new ImageIcon("images/delete.png");
            deleteB = new JButton();
            deleteB.setIcon(iconDelete);
            deleteB.setToolTipText("Удалить заявку");
            deleteB.setFocusable(false);
            toolBar.add(sep1);
            toolBar.add(deleteB);    
            
            //Кнопка удаления всего
            deleteAllB = new JButton();
            ImageIcon deleteAllIcon = new ImageIcon("images/deleteAll.png");
            deleteAllB.setIcon(deleteAllIcon);
            deleteAllB.setToolTipText("Произвести автоудаление");
            deleteAllB.setFocusable(false);
            toolBar.add(deleteAllB);

            JSeparator sep2 = new JSeparator();
            sep2.setOrientation(JSeparator.VERTICAL);
            toolBar.add(sep2);

            
            ImageIcon preferencesIcon = new ImageIcon("images/preferences.png");
            preferencesB = new JButton();
            preferencesB.setFocusable(false);
            preferencesB.setIcon(preferencesIcon);
            preferencesB.setToolTipText("Настроить автоудаление");
            toolBar.add(preferencesB);
            
        }

        /*ImageIcon helpIcon = new ImageIcon("images/help.png");
        helpB = new JButton();
        helpB.setFocusable(false);
        helpB.setIcon(helpIcon);
        helpB.setToolTipText("Справка");

        JSeparator sep3 = new JSeparator();
        sep3.setOrientation(JSeparator.VERTICAL);
        toolBar.add(sep3);
        toolBar.add(helpB);*/

        /*****************************************************************
         * Создаем левую панельку
         ****************************************************************/
         leftPanel = new LeftDemandPanel(this.admin);
         horSplit.setLeftComponent(leftPanel);

         this.demandTable = new DemandTablePanel();
         verSplit.setTopComponent(demandTable);
         verSplit.setResizeWeight(0.7);

         leftPanel.setTable(demandTable.getTable());
         //leftPanel.setAdmin(this.admin);

         demandPanel = new DemandPanel(this.admin);
         demandPanel.setLeftDemandPanel(leftPanel);
         demandPanel.setTable(demandTable.getTable());
         demandPanel.setIAdmin(this.admin);
         verSplit.setBottomComponent(demandPanel);

         leftPanel.setAdminsrightComboBox(demandPanel.getAdminsList());

         /****************************************************************
          * Привязываем события
          **************************************************************/
         refreshB.addActionListener(new ActionListener()
             {
                public void actionPerformed(ActionEvent e)
                {
                try {
                    refreshDemands();
                } catch (RemoteException ex) {
                    DesignTools.showMessage("Сообщение не отправлено", "Возможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
                }
                }
             });

         if (deleteB != null)
         deleteB.addActionListener(new ActionListener()
             {
                public void actionPerformed(ActionEvent e)
                 {
                    deleteDemand();
                 }
             });

        if (preferencesB != null)
            preferencesB.addActionListener(new ActionListener()
                 {
                    public void actionPerformed(ActionEvent e)
                     {
                        showPreferences();
                     }
                 });

        if (deleteAllB != null)
            deleteAllB.addActionListener(new ActionListener()
                 {
                    public void actionPerformed(ActionEvent e)
                     {
                        deleteAll();
                     }
                 });

        nextB.addActionListener(new ActionListener()
             {
                public void actionPerformed(ActionEvent e)
                 {
                    nextDemand();
                 }
             });

        previousB.addActionListener(new ActionListener()
             {
                public void actionPerformed(ActionEvent e)
                 {
                    previousDemand();
                 }
             });

        ListSelectionModel lsm = demandTable.getTable().getSelectionModel();
        lsm.addListSelectionListener(new ListSelectionListener()
            {
                public void valueChanged(ListSelectionEvent e) {
                    showDemand();
                }
            });

        //Создаем поток чекера
        checker = new CheckerDemands(this);
        checker.start();

        this.setVisible(true);
    }

    /*******************************************************
     * Основные процедуры интерфейса
     ******************************************************/

    //Нажатие на кнопку обновления
    protected void refreshDemands() throws RemoteException
    {
        leftPanel.filterDemands();
        Actions.refreshAdminComboBox(demandPanel.getAdminsList(), false);
        Actions.refreshAdminComboBox(leftPanel.getComboBoxAdmin(), false);
        Actions.refreshComputers(leftPanel.getComputersCB());
    }

    protected void showPreferences()
    {
        AutoDeleteSettings ads = new AutoDeleteSettings(this);
    }

    //Нажатие на кнопку применения автоматического удаления
    protected void deleteAll()
    {
        Actions.autoDeleteDemands();
    }

    //Нажатие кнопки удаления заявки
    protected void deleteDemand()
    {
        JTable table = demandTable.getTable();
        Actions.deleteDemand(table);
    }

    //Нажатие кнопки следующей заявки
    protected void nextDemand()
    {
        JTable table = demandTable.getTable();
        int i = table.getSelectedRow();

        if (i < table.getRowCount()-1)
            i++;
        else
            i = 0;

        table.getSelectionModel().setLeadSelectionIndex(i);
    }

    //Нажатие кнопки предыдущей заявки
    protected void previousDemand()
    {
        JTable table = demandTable.getTable();
        int i = table.getSelectedRow();

        if (i > 0)
            i--;
        else
            i = table.getRowCount()-1;

        table.getSelectionModel().setLeadSelectionIndex(i);
    }

    //Выбор строки в таблице
    protected void showDemand()
    {
        JTable table = demandTable.getTable();
        DemandsTModel model = (DemandsTModel) table.getModel();

        Demand d = model.getDemandAt(table.getSelectedRow());
        try
        {
            Admin admin = model.getAdmin(d);
            demandPanel.showDemand(d, admin);
        }
        catch (Exception e) {
            demandPanel.clearDemand();
        };
    }

    public LeftDemandPanel getLeftPanel()
    {
        return this.leftPanel;
    }

}
